PostgreSQL pg_stat_statements pgbench基准测试

1 背景知识

本文主要介绍如何利用 pgbech 进行性能测试,并通过 pg_stat_statements 扩展查看SQL 语句的统计信息。

2 清空统计信息

psql -U postgres -d testdb
#postgres> 
SELECT pg_stat_statements_reset();
Note

这里不传入参数时,默认传入参数 0,表示清空统计信息。

3 基准测试

3.1 基准测试

  1. 数据生成并进行基准测试。
su - postgres
#postgres>
pgbench  -U postgres -i testdb -s 10
pgbench -c10 -t300 testdb
  1. 测试结果。
pgbench (16.2)
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
maximum number of tries: 1
number of transactions per client: 300
number of transactions actually processed: 3000/3000
number of failed transactions: 0 (0.000%)
latency average = 6.056 ms
initial connection time = 42.764 ms
tps = 1651.132264 (without initial connection time)
  1. 参数说明。
选项 参数 说明
-c 10 并发数据库客户端数量。默认为1
-t 300 每个客户端运行的事务数量。

3.2 统计信息查询

  1. 查询 pg_stat_statements_info 视图 执行时间最长的前5名。
#postgres>
psql -U postgres -d testdb
--testdb#
SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit /
               nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
          FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;
  1. 输出信息。
-[ RECORD 1 ]---+--------------------------------------------------------------------
query           | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2
calls           | 3000
total_exec_time | 7041.544347000013
rows            | 3000
hit_percent     | 99.9981707763225287
-[ RECORD 2 ]---+--------------------------------------------------------------------
query           | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2
calls           | 3000
total_exec_time | 6016.957095999991
rows            | 3000
hit_percent     | 99.9953684405539345
-[ RECORD 3 ]---+--------------------------------------------------------------------
query           | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2
calls           | 3000
total_exec_time | 139.5114090000003
rows            | 3000
hit_percent     | 98.7694097641741621
-[ RECORD 4 ]---+--------------------------------------------------------------------
query           | copy pgbench_accounts from stdin with (freeze on)
calls           | 1
total_exec_time | 95.47931
rows            | 100000
hit_percent     | 100.0000000000000000
-[ RECORD 5 ]---+--------------------------------------------------------------------
query           | alter table pgbench_accounts add primary key (aid)
calls           | 1
total_exec_time | 42.100152
rows            | 0
hit_percent     | 100.0000000000000000

3.3 输出说明

pg_stat_statements 视图 中查询执行时间为前五的SQL 语句。

字段 说明
query 查询文本
Calls 调用此数。
total_exec_time 共计消耗的执行时间。
rows 影响的行数。
hit_percent 缓存命中率。

4 参考连接

PostgreSQL: Documentation: 16: F.32. pg_stat_statements — track statistics of SQL planning and execution